<?php
/**
 * @author jeff liu
 * 控制器基类 定义了 控制器的基本方法
 */

Importer::importFile('core.object', 'php', ROOT_PATH);

Importer::importFile('core.view.view', 'php', ROOT_PATH);

Importer::importFile('userVistor', 'class.php');


class BaseCtl extends Object
{
    protected $view = null; //视图对象
    protected $visitor = null; //访问者对象


    public function __construct()
    {
        //初始化 视图类, session 和 访问者
        $this->init();
    }

    /**
     * 将值设置到模版变量中
     * @param mixed $var
     * @param mixed $value
     */
    function assign($var = null, $value = null)
    {
        $this->view->assign($var, $value);
    }

    /**
     * 获得模版 替换之后的内容
     * @author jeff liu
     * @param string $file
     * @return string
     */
    function fetch($file)
    {
        return $this->view->fetch($file);
    }

    /**
     * 获得 模版变量
     * @author jeff liu
     * @param mixed $var
     * @return mixed
     */
    function get($var = null)
    {
        return $this->view->get($var);
    }

    /**
     * 显示模版信息
     * @author jeff liu
     * @param type $tpl
     */
    function display($tpl = null)
    {
        $this->view->display($tpl);
    }

    /**
     * 为框架的正常运行进行必要的初始化工作
     */
    protected function init()
    {
        //初始化 视图类
        $this->initView();

        //初始化session
        $this->initSession();

        //初始化访问者
        $this->initVisitor();
    }

    protected function initView()
    {
    }

    /**
     * 初始化session
     * @author jeff liu
     */
    protected function initSession()
    {

    }

    /**
     * 初始化访问者
     * @author jeff liu
     */
    protected function initVisitor()
    {

    }

    public function doAction($args)
    {
        /**
         * 需要执行的action
         * @var string
         */
        $act = $args['act'];


        /**
         * 当前action的前置动作
         * @var string
         */
        $prefix_act = 'prefix' . ucfirst($act);

        /**
         * 当前action的后置动作
         * @var string
         */
        $post_act = 'post' . ucfirst($act);

        $prefix_act = method_exists($this, $prefix_act) ? $prefix_act : 'prefixDoAct';
        $post_act = method_exists($this, $post_act) ? $post_act : 'postDoAct';

        /**
         * 当前动作的执行结果
         * @var boolean
         */
        $smvc_func_rs = true;

        $args['smvc_func_rs'] = $smvc_func_rs;
        //执行当前action的前置动作
        $smvc_func_rs = call_user_func_array(array($this, $prefix_act), $args);

        //执行当前acition
        $args['smvc_func_rs'] = $smvc_func_rs;
        $smvc_func_rs = $this->$act($smvc_func_rs);

        //执行当前action的后置动作
        $args['smvc_func_rs'] = $smvc_func_rs;
        $smvc_func_rs = call_user_func_array(array($this, $post_act), $args);

        return $smvc_func_rs;
    }

    protected function prefixDoAct($args)
    {

    }

    protected function postDoAct($args)
    {

    }

    /**
     * 发送get请求
     * @author jeff liu
     * @param string $url
     * @param mixed $data
     * @return array
     */
    public static function getRequest($url, $data)
    {
        return self::request($url, $data, 'get');
    }

    /**
     * 发送post请求
     * @author jeff liu
     * @param string $url
     * @param array $data
     * @return array
     */
    public static function postRequest($url, $data)
    {
        return self::request($url, $data, 'post');
    }

    /**
     * 请求公共处理逻辑
     * @author jeff liu
     * @param string $url
     * @param array $data
     * @param string $type
     * @return array
     */
    protected static function request($url, $data, $type = 'get')
    {
        $lst = array();
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        if ($type == 'post') {
            $params = '';
            if (empty($data)) {
                $params = http_build_query($data);
            }
            curl_setopt($ch, CURLOPT_POST, 1); //启用POST提交
            curl_setopt($ch, CURLOPT_POSTFIELDS, $params); //启用POST提交
        }

        $lst['rst'] = curl_exec($ch);
        $lst['info'] = curl_getinfo($ch);
        curl_close($ch);

        return $lst;
    }
}